package com.kk.xhr.model.service;

import com.kk.xhr.common.ErrorCodeEnum;
import com.kk.xhr.common.pojo.UserStatusEnum;
import com.kk.xhr.model.dto.PageDto;
import com.kk.xhr.model.dto.UserDTO;
import com.kk.xhr.model.dto.UserInfoDTO;
import com.kk.xhr.model.dto.UserQueryRequestDTO;
import com.kk.xhr.model.entity.User;
import org.apache.commons.lang3.tuple.Pair;

import java.util.List;
import java.util.Optional;
import java.util.Set;

/**
 * 用户接口
 *
 * @author kkmystery
 * @version 1.0 2021/2/28
 * @since 1.0.0
 */
public interface IUserService {

    /**
     * 通过主键id查询
     *
     * @param id 主键id
     * @return userDto
     */
    Optional<UserDTO> queryById(Long id);

    /**
     * 通过主键id查询
     *
     * @param id 主键id
     * @return user
     */
    User queryUser(Long id);

    /**
     * 通过主键id查询有效的用户
     *
     * @param id 主键
     * @return userDto
     */
    Optional<UserDTO> queryNormal(Long id);

    /**
     * 根据用户id查询工号
     *
     * @param userId 用户id
     * @return 工号
     */
    Long queryWorkId(Long userId);

    /**
     * 根据工号查询用户
     *
     * @param workId 工号
     * @return userDto
     */
    Optional<UserDTO> queryByWorkId(Long workId);

    /**
     * 根据工号查询用户id
     *
     * @param workId 工号
     * @return 用户id
     */
    Optional<Long> queryUserId(Long workId);

    /**
     * 查询名字
     *
     * @param userId 用户id
     * @return 名字
     */
    String queryName(Long userId);

    /**
     * 分页查询
     *
     * @param dto 用户查询dto
     * @return UserDTO
     */
    PageDto<UserDTO> queryPage(UserQueryRequestDTO dto);

    /**
     * 查询用户信息列表（用于选择器枚举）
     *
     * @return 用户信息vo
     */
    List<UserInfoDTO> query();

    /**
     * 根据部门id查询
     *
     * @param id 部门id
     * @return 用户列表
     */
    List<UserDTO> queryByDepartmentId(Long id);

    /**
     * 查询最新的User
     *
     * @return 用户
     */
    Optional<User> queryLast();

    /**
     * 根据部门id查询用户id
     *
     * @param departmentIds 部门id列表
     * @return 用户id集合
     */
    Set<Long> queryByDepartmentIds(List<Long> departmentIds);

    /**
     * 添加用户
     *
     * @param dto UserDTO
     * @return 是否成功
     */
    Long add(UserDTO dto);

    /**
     * 修改User
     *
     * @param dto 用户
     * @return 是否成功
     */
    boolean modify(UserDTO dto);

    /**
     * 修改用户状态
     *
     * @param id     主键id
     * @param status 状态
     * @return 是否成功
     */
    boolean modify(Long id, UserStatusEnum status);

    /**
     * 根据用户名和密码进行登录
     *
     * @param username 用户名
     * @param password 密码
     * @return 错误码和用户信息
     */
    Pair<ErrorCodeEnum, User> loginByPwd(String username, String password);

    void modifyPassword(Long userId, String password);

    /**
     * 查询是否有该职位的员工
     *
     * @param id 职位id
     * @return 是否
     */
    boolean existPosition(Long id);

    /**
     * 查询是否有该等级的员工
     *
     * @param id 等级id
     * @return 是否
     */
    boolean existLevel(Long id);
}
